#ifndef CAMERA_H
#define CAMERA_H

#ifndef GENESIS_DATATYPES
#define GENESIS_DATATYPES
typedef unsigned char byte;
typedef unsigned short word;
#endif

#define upperWord(val) (val&0xFFFF0000)>>16
void bgScrollSpeed(word, word, word);
void ScrollBlock1(long, long);
void ScrollBlock2(long, long);
void ScrollBlock3(signed short);
void ScrollBlock4();
void ScrollHoriz();

void ScrollVertical();
void ScrollVertical_Check16(long &, signed short);

void ScrollVertical_NoScroll(long &);
void ScrollVertical_Up(long &, word);
void ScrollVertical_Down(long &, word);

void ScrollVertical_AtCenter(long &, signed short);
void ScrollVertical_AboveCenter(long &);
void ScrollVertical_BelowCenter(long &);

void MoveScreenHoriz();

void BgScroll_GHZ(word, word);
void BgScroll_LZ(word, word);
void BgScroll_MZ(word, word);
void BgScroll_SLZ(word, word);
void BgScroll_SYZ(word, word);
void BgScroll_SBZ(word, word);
void BgScroll_End(word, word);


void LevelSizeLoad(word);
void LevelRenderLimitsLoad(word);

void DeformLayers(word);
void Deform_GHZ();

void pcScrolling();
void pcLevelBounds();
void pcStartLocations();

long *cameraGetHScrollTable();

void DynamicLevelEvents();
void DLE_GHZ();
void DLE_GHZ1();
void DLE_GHZ2();
void DLE_GHZ3();
void DLE_GHZ3main();
void DLE_GHZ3boss();
void DLE_GHZ3end();

struct LevelSizeIndex
{
   word FFFFF730val;
   unsigned short v_limitleft;
   unsigned short v_limitright;
   unsigned short v_limittop;
   unsigned short v_limitbtm;
   word v_lookshift;
};

struct StartLocationIndex
{
   word x;
   word y;
};

#endif
